#include "stm32f10x.h"    
#include "freertos.h"
#include "task.h"
#include "queue.h"
#include "Delay.h"

//#include "ESP01s_Control.h"
#include "USART_SendString.h"
#include "USART_RecvString.h"

#include <string.h>

#define QUEUE_LENGTH 16	 			// 队列长度
#define ITEM_SIZE sizeof(char)		// 消息队列中传递的是一个字符串指针（地址），而不是字符串本身，处理效率较高
QueueHandle_t xQueue;

void vTask_ESP01s_Controller(void *arg);
void vTask_USART_Handler(void *arg);
void vReceiverTask(void *pvParameters);

int main(void){
	Delay_Init();						// 初始化 Delay函数
	
	USART1_TxRx_Init();Delay_ms(1000);  // 初始化 USB_TO_TTL，注意此处不使用Delay会输出"?"
    USART1_Init();       				// 初始化 传送字符格式
	USART1_NVIC_Init();  				// 初始化 中断源优先级
	
	xQueue = xQueueCreate(8, QUEUE_LENGTH * ITEM_SIZE);
	
	USART1_SendString("AT\r\n");  		// 测试1：测试串口发送功能，已通过
	
//	xTaskCreate(vTask_USART_Handler, "vTask_UART_Handler", configMINIMAL_STACK_SIZE * 4, NULL, 1, NULL); 		// 启动调度程序	
	xTaskCreate(vTask_ESP01s_Controller, "vTask_LED_Controller", configMINIMAL_STACK_SIZE * 4, NULL, 1, NULL);		// 串口任务优先级更低
 	vTaskStartScheduler();					// 启动调度器
	
//	while(1);								// 程序不应执行到这里
}



//// 串口任务（专注指令接收）
//void vTask_USART_Handler(void *arg) {
//	USART1_printf(
//		"=== LED Controller ===\r\n"
//		"COMMANDS:\r\n"
//		"  OFF\\r    - Power off LED\r\n"
//		"  ON\\r     - Power on LED\r\n"
//		"  BLINK\\r  - Start blinking\r\n"
//		"-----------------------\r\n"
//		"Waiting for input...\r\n"
//	);
//	
//    while(1);
//}

// USART1控制任务
void vTask_ESP01s_Controller(void *arg) {	
    while(1) {
		char str[QUEUE_LENGTH] = {0};
		
		if(xQueueReceive(xQueue, &str, 1000) == pdPASS){	// 写portMAX_DELAY会被持续阻塞
			USART1_printf("Receive the str: %s \r\n", str);
//			LED_Control(str); 
		}else{
			USART1_printf("Not receive now \r\n");
		}
		
		vTaskDelay(1000);
	}
}
